home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994…tember: Reference Library / Dev.CD Sep 94.toast / Periodicals / develop / develop Issue 15 / develop 15 code / Text To Speech media handler / Code / MyOpenComponent.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-30  |  5.6 KB  |  200 lines  |  [TEXT/KAHL]

  1. #include "ComponentData.h"
  2. #include "MyOpenComponent.h"
  3.  
  4. pascal ComponentResult MyOpenComponent(ComponentInstance self)
  5. {
  6. ComponentResult    result = 0;    // Must be 0 for RegisterComponent
  7. PrivateGlobals    **storage;
  8. SharedGlobals    *mySharedGlobalsPtr;
  9.  
  10. if (storage = (PrivateGlobals **) NewHandleClear( sizeof(PrivateGlobals) ))
  11.     {
  12.     HLock(storage);
  13.     
  14.     /***********************************
  15.         We need self for REGISTERCOMPONENT
  16.         Set storage BEFORE calling ComponentSetTarget and 
  17.             RegisterComponent    
  18.     ***********************************/    
  19.     (*storage)->self = self;
  20.     SetComponentInstanceStorage (self, (Handle) storage);    
  21.  
  22.     /************************************
  23.         If we have global storage, we have registered, and grabbed
  24.         the base component. We now need to open the base component, 
  25.         and target it.If no global storage, we do nothing more
  26.         and wait for the register call.
  27.     ***********************************/    
  28.     mySharedGlobalsPtr = GetComponentGlobals(storage);
  29.     if (mySharedGlobalsPtr)            // Did we call REGISTERCOMPONENT?
  30.         {
  31.         /* Do these routines once for all instances. We check for a 0 delegateComponent,
  32.             and then we fill it up */
  33.         if (!mySharedGlobalsPtr->delegateComponent)
  34.             {
  35.             if ( QuickTimeAvailable() && SpeechAvailable() )
  36.                 {
  37.                 Component delegateComponent=0;
  38.             
  39.                 delegateComponent = GetDelegateComponent();    
  40.                 if (delegateComponent)
  41.                     mySharedGlobalsPtr->delegateComponent = CaptureComponent (delegateComponent,  (Component)(*storage)->self);
  42.                 }
  43.             else 
  44.                 return -1;    // Bail: No QuickTime and/or Speech Manager
  45.             }
  46.             
  47.         (*storage)->delegate = OpenComponent (mySharedGlobalsPtr->delegateComponent);
  48.         result = ComponentSetTarget ((*storage)->self, (*storage)->self);
  49.             
  50.         if ((*storage)->delegate)
  51.             {    
  52.             OSErr    err;        
  53.             /************************************
  54.                 If these routines fail, we don't care
  55.             ***********************************/    
  56.             DoSetTTS(storage);        // get voice characteristics
  57.             GetInstanceSpeechChannel(storage,mySharedGlobalsPtr);
  58.             (*storage)->textH             = NewHandleClear(sizeof(Handle));
  59.             (*storage)->translatedTextH = NewHandleClear(sizeof(Handle));
  60.             }
  61.         }
  62.     }
  63.     
  64. return (result);
  65. }
  66.  
  67. Component GetDelegateComponent(void)
  68. {
  69. ComponentDescription    delegateDesc;
  70. Component                delegateComponent;
  71.  
  72. delegateDesc.componentType             = kCaptureComponentType;
  73. delegateDesc.componentSubType         = kCaptureComponentSubType;
  74. delegateDesc.componentManufacturer     = kCaptureComponentManufacturer;
  75. delegateDesc.componentFlags         = kCaptureComponentFlags;
  76. delegateDesc.componentFlagsMask     = kCaptureComponentFlagsMask;
  77.  
  78. delegateComponent = FindNextComponent (nil, &delegateDesc);
  79.  
  80. return delegateComponent;
  81. }
  82.  
  83. Boolean QuickTimeAvailable(void)
  84. {
  85. OSErr    err=noErr;
  86. long    result;
  87.  
  88. err = Gestalt(gestaltQuickTime,&result);
  89. if ( err )
  90.     return false;
  91. else
  92.     return true;
  93. }
  94.  
  95. Boolean SpeechAvailable(void)
  96. {
  97. OSErr    err=noErr;
  98. long    result;
  99.  
  100. err = Gestalt(gestaltSpeechAttr,&result);
  101. if ( err )     
  102.     return false;
  103. else
  104.     return true;
  105. }
  106.  
  107. ComponentResult DoSetTTS(PrivateGlobals **storage)
  108. {
  109. Component                 ttsComponent;
  110. ComponentInstance         ttsCInstance;
  111. ComponentDescription     ttsDesc;
  112. Point                     where = {0,0};
  113. OSErr                     err = componentDontRegister;
  114. ComponentResult            result=-1;
  115.  
  116. ttsDesc.componentType             = stdTextToSpeechComponentType;
  117. ttsDesc.componentSubType         = 0;
  118. ttsDesc.componentManufacturer     = 'appl';
  119. ttsDesc.componentFlags             = 0;
  120. ttsDesc.componentFlagsMask         = 0;
  121.  
  122. ttsComponent = FindNextComponent(nil, &ttsDesc); 
  123.  
  124. #define kDefaultVoice 1
  125. GetIndVoice(kDefaultVoice,&((*storage)->coolTTSParams.curVoice.voice));
  126.  
  127. if (ttsComponent)
  128.     {
  129.     ttsCInstance     = OpenComponent(ttsComponent);
  130.     result             = StdSpeechDialog(ttsCInstance, &(*storage)->coolTTSParams, &where);
  131.     err             = CloseComponent(ttsCInstance);
  132.     }
  133.     
  134. return result;
  135. }
  136.  
  137.  
  138. ComponentResult GetInstanceSpeechChannel(PrivateGlobals **storage,SharedGlobals    *mySharedGlobalsPtr)
  139. {
  140. OSErr             err=noErr;
  141.  
  142. err = NewSpeechChannel(&(*storage)->coolTTSParams.curVoice.voice,&(*storage)->coolSpeechChannel);
  143. if (!err)
  144.     {
  145.     //  We have a channel: these routines are icing, don't care if they fail
  146.     SetSpeechInfo((*storage)->coolSpeechChannel,    soRefCon,        mySharedGlobalsPtr);
  147.     SetSpeechInfo((*storage)->coolSpeechChannel,     soRate,         &(*storage)->coolTTSParams.rate);
  148.     SetSpeechInfo((*storage)->coolSpeechChannel,     soPitchMod,        &(*storage)->coolTTSParams.modulation);
  149.     SetSpeechInfo((*storage)->coolSpeechChannel,     soPitchBase,     &(*storage)->coolTTSParams.pitch);
  150.     }
  151.     
  152. return (ComponentResult) err;
  153. }
  154.  
  155.  
  156. Component GetMyOriginal(PrivateGlobals **storage)
  157. {
  158. ComponentDescription    originalDesc;
  159. Component                originalComponent;
  160. ComponentResult            result;
  161. Component                cloneComponent;
  162.  
  163. originalDesc.componentType             = kCaptureComponentType;
  164. originalDesc.componentSubType         = kCaptureComponentSubType;
  165. originalDesc.componentManufacturer    = kMyManufacturer;
  166. originalDesc.componentFlags         = kCaptureComponentFlags;
  167. originalDesc.componentFlagsMask     = kCaptureComponentFlagsMask;
  168.  
  169. result = GetComponentInfo ((Component) (*storage)->self, &originalDesc, nil, nil, nil);
  170. cloneComponent = (Component)(originalDesc.componentFlagsMask);
  171.  
  172. do
  173.     {
  174.     originalComponent = FindNextComponent (nil, &originalDesc);
  175.     }    
  176. while ( originalComponent == cloneComponent );
  177.  
  178. return originalComponent;
  179. }
  180.  
  181.  
  182. SharedGlobals *GetComponentGlobals(PrivateGlobals **storage)
  183. {
  184. Component        originalComponent;
  185. SharedGlobals     *mySharedGlobalsPtr;
  186.  
  187. mySharedGlobalsPtr = nil;
  188. if (GetComponentInstanceA5((*storage)->self))        // been cloned
  189.     {
  190.     originalComponent = GetMyOriginal(storage);
  191.     mySharedGlobalsPtr = (SharedGlobals    *) GetComponentRefcon( originalComponent );
  192.     }
  193. else
  194.     mySharedGlobalsPtr = (SharedGlobals    *) GetComponentRefcon( (Component) (*storage)->self );
  195.  
  196. return mySharedGlobalsPtr;
  197. }
  198.  
  199.  
  200.